/**
 * @description 所有人可使用的参数配置列表
 * @params hideMenu: 是否隐藏当前路由结点不在导航中展示
 * @params alwayShow: 只有一个子路由时是否总是展示菜单，默认false
 */
import { reactive, getCurrentInstance } from 'vue'
import { createRouter, createWebHashHistory } from 'vue-router'
import store from '@/store'
import i18n from '@/locale'
import NProgress from '@/utils/system/nprogress'
import { changeTitle } from '@/utils/system/title'
import VueCookies from 'vue-cookies'

NProgress.configure({ showSpinner: false })

// 引入不需要权限的modules
import System from './modules/system'
import { get } from 'lodash'

/** 
 * @name 初始化必须要的路由
 * @description 使用reactive属性使得modules可以在路由菜单里面实时响应，搞定菜单回显的问题
 * @detail 针对modules的任何修改，均会同步至菜单级别，记住，是针对变量名为：moduels的修改
 **/
let modules = reactive([
  ...System
])

const { t } = i18n.global

const router = createRouter({
  history: createWebHashHistory(),
  routes: modules
},
)

// 未授权时可访问的白名单
const whiteList = ['/login', '/register']

// 路由跳转前的监听操作
router.beforeEach((to, _from, next) => {
  NProgress.start(); // 使用 NProgress 开始页面进度条加载动画
  // 从后台获取登录的token
  // let internalInstance = getCurrentInstance();
  // let cookies = internalInstance.appContext.config.globalProperties.$cookies
  const Cookies:any = VueCookies

  if (!Cookies.get('token')) {
    // store.dispatch('user/loginOut')
  }

  if (store.state.user.token) { // 如果用户已登录（存在 token）
    // 如果路由的元信息中定义了 title，就动态修改页面的标题
    to.meta.title ? changeTitle(to.meta.title) : "";
    if (to.path === '/login' || to.path === "/defaultParams" || to.path === "/404") { // 如果用户已登录但访问的是登录页，则跳转到首页
      if (store.state.user.is_super) {// 管理员
        if (to.path === "/defaultParams") {
          next();
          return;
        }
        next('/');
        return;
      } else if (store.state.user.is_teacher) {// 教师
        next('/teacher');
        return;
      } else {
        // 因为学生要进入容器，先暂时注释掉学生的访问权限。
        next('/student');// 学生
        return;

      }
    }
    next(); // 继续执行路由跳转
  } else if (whiteList.includes(to.path)) { // 如果用户未登录但访问的路径在白名单中
    to.meta.title ? changeTitle(to.meta.title) : ""; // 动态修改页面标题
    next(); // 继续执行路由跳转
  } else { // 如果用户未登录且访问的路径不在白名单中，则跳转到登录页
    next("/login");
    to.meta.title ? changeTitle(to.meta.title) : ""; // 动态修改页面标题
  }
});

// 路由跳转后的监听操作
router.afterEach((to, _from) => {
  const keepAliveComponentsName = store.getters['keepAlive/keepAliveComponentsName'] || [];
  const name = to.matched[to.matched.length - 1].components.default.name;
  // 如果路由的元信息中定义了 cache，并且组件名存在且不在已缓存的组件列表中，则添加到缓存列表中
  if (to.meta && to.meta.cache && name && !keepAliveComponentsName.includes(name)) {
    store.commit('keepAlive/addKeepAliveComponentsName', name);
  }
  if (store.state.user.is_super) {// 管理员

  } else if (store.state.user.is_teacher) {// 教师

  } else {// 学生

  }
  NProgress.done(); // 页面加载完成，结束进度条加载动画
});


export {
  modules
}

export default router
